<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <script>
        function fn(){
            console.log('你好');
            console.log(this);
        }
        var o = {
            name:'andy'
        }
        //call本身就可以调用方法
        fn.call()  //this指向window
        //call可以改变函数的this指向
        fn.call(o)

        //借用父构造函数继承属性
        //父构造函数
        function father(uname,age){
            //this指向父构造函数的对象实例
            this.uname=uname;
            this.age=age;
        }
        father.prototype.money=function(){
            console.log(100000);
        }
        console.log(father.prototype);
        //子构造函数
        function son(uname,age){
            //this指向子构造函数的对象实例
            //就变成了son.uname=uname
            father.call(this,uname,age)
        }
        
        //这会使子构造函数的原型对象指向父构造函数原型对象的地址
        //这样做是不对的
        // son.prototype=father.prototype

        //通过使son的原型对象指向father的一个实例对象 这样做的同时覆盖了son的原型对象
        //进而继承father的方法
        //再把son原型对象的constructor指回son
        son.prototype = new father()
        son.prototype.constructor=son
        
        son.prototype.exam=function(){
            console.log('孩子要考试');
        }
        var son = new son('刘德华',18)
        console.log(son);
        console.log(father);
        
        
    </script>
</body>
</html>